-
Notifications
You must be signed in to change notification settings - Fork 114
Fix consuming window insets in system window insets padding #2665
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
...ation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt
Show resolved
Hide resolved
...ation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt
Outdated
Show resolved
Hide resolved
| insetsCalculation: PlatformWindowInsets.() -> WindowInsets, | ||
| ): Modifier = this then | ||
| PlatformInsetsPaddingModifierElement(inspectorInfo) then | ||
| PlatformWindowInsetsPaddingModifierElement(inspectorInfo, insetsCalculation) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Adding both of them works, but kind of suspicious and creates more elements to allocate/iterate/etc 🤔
Just to be informed: what's about these alternatives?
- Delegate
PlatformWindowInsetsProviderNodefromInsetsPaddingModifierNode(not visa versa). - Using
DelegatableNode.visitAncestors(includeDelegates = true)
(1) looks more promising for me. WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The problem in general is that both the PlatformWindowInsetsProviderNode and InsetsPaddingModifierNode are traversable (they have different TraverseKey) and need to traverse their respective descendants to update them with ancestor properties.
As for
- I have thought about delegating
PlatformWindowInsetsProviderNodefromInsetsPaddingModifierNodebut the problem is that the commonInsetsPaddingModifierNodeis not aDelegatingNodeso we cannot delegate from it to another node. And I am not sure we want to make it aDelegatingNodein common just to use this functionality on the platform level. Also I think that the problem with the delegated node not being discovered would still remain. Or do you see some other option that I don't? DelegatableNode.visitAncestors(includeDelegates = true)is internal tocommonMainso is the idea to use it inInsetsConsumingModifierNodeinstead oftraverseAncestors?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is internal to commonMain
It's internal to the module, not source-set
ASalavei
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, please fix tests
3e294b9 to
e2c0104
Compare
This PR fixes an issue where window insets (like
statusBarsPadding()) did not correctly respect or propagate consumed window insets. The core problem was that theInsetsPaddingModifierNodelogic was "hidden" from the layout traversal system because it was implemented via delegation.The
Modifier.windowInsetsPaddingnow applies two separate modifiers which create nodes of two types:PlatformInsetsPaddingModifierNodeis anInsetsPaddingModifierNodethat handles actual layout padding and correct resolve of window insets consumed by ancestors.PlatformWindowInsetsPaddingModifierNodeis responsible for retrieving platform-specificWindowInsetsvalues. On attachment, it traverses up the modifier chain to find the ancestorPlatformInsetsPaddingModifierNodeand establishes a link. It provides the insets back up to this ancestor node.Fixes CMP-9390 iOS seems to ignore consumeWindowInsets
Testing
Adds skiko tests to
WindowInsetsTestThis should be tested by QA
Release Notes
Fixes - Multiple Platforms